# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request #要使用这个去爬取网址

"""
import sys
sys.path.append("..")   #现在这两句不写也没事了,导入自定义模块的事情，请参照书签
"""

#所有的导入都从核心文件开始——第二个“dangdangwang”
from dangdangwang.items import DangdangwangItem  #这里不能写dangdangwang.items

class DdSpider(scrapy.Spider):
    name = 'dd' #爬虫名
    allowed_domains = ['dangdang.com']  #允许爬取的范围
    start_urls = ["http://category.dangdang.com/pg1-cid10010337.html"]  #开始爬取的第一页——最开始请求的url地址

    #这个地方必须叫parse，不叫parse，报错：NotImplementError——方法没有完成（没写好），说明再scrapy.Spider里面村子啊一个parse方法，这个方法没有写完，这里必须写好重载（覆盖）
    def parse(self, response):  #爬取的信息都在response里面——data
        #处理start_url地址对应的响应response
        """
        """

        #Alist = [](错！！！！！)     好像一般都不创建列表，然后在存放一系列对象？？？后面继续观察（这个问题在下面得到了解答）
        #第一种方法——yield一个BaseItem对象
        item = DangdangwangItem()

        # extract方法：从一个SelectorList（List的子类）中提取（返回）data返回一个列表
        #这里extract返回的列表长度可不是为1，而是当前页面所有的title！！！跟第二种方法不一样
        item["title"] = response.xpath('//a[@name = "itemlist-picture"]/@title').extract()
        #scrapy对提取到的结果进行了一次封装，包含xpath的规则和提取到的结果
        #extract方法返回的是，本应通过xpath直接提取的数据
        item["link"] = response.xpath('//a[@name = "itemlist-picture"]/@href').extract()
        item["comment"] = response.xpath('//a[@dd_name="单品评论"]/text()').extract()
        #print(item["tite"])    必须这样才能运行——PS E:\Pycharm\PyCharm Community Edition 2017.3.3\projects\30小时Python网络爬虫\Scrapy框架\dangdangwang> scrapy crawl dd
        #现在的settings里面robot默认是True！

        #这里是可以进行数据处理的，但是不是在这里写，使用yield提交数据过去
        #这里返回的必须是一个 Request、BaseItem、dict or None   这些数据类型；不能返回列表；返回列表的话会占用内存，所以没有这么限制
        yield item

        for i in range(2,4):
            url = "http://category.dangdang.com/pg"+ str(i) +"-cid10010337.html"
            #yield，返回之后继续执行
            #这里是parse，不是parse（），不能打括号
            yield Request(url,callback=self.parse)
            #运行结果是240=48*5，刚刚好


        """
        #第二种方法——返回一个字典
        #先分组，再提取数据（每个li标签都是一个组）

        #这里巨坑！！！li必须加以限制，因为在这个li里面还有一个div-ul-li框架——衣服的颜色款式！！！1
        #结论：以后这种写法的li的限制全部加上
        li_list = response.xpath('//div[@dd_name="普通商品区域"]/ul//li[@ddt-pit and @class]') #返回的是一个SelectorList（List的子类）
        #print(li_list)
        """

        """
        li_list都是这样的玩意儿——一个SelectorList（List的子类）
        [<Selector xpath="……",data=''>,<Selector xpath="……",data=''>,<Selector xpath="……",data=''>，……]
        
        .extract()之后
        ['','','',……]——每个data值组成的列表
        """

        """
        for li in li_list:
            item = {}
            #这里是字典的写法，你必须返回一个字符串，所以是    .extract()[0]
            #使用extract_first(返回一个字符串)可以再找不到对应字段的情况下，自动赋予None值，这样就避免了使用extract需要判断的情况
            item["title"] = li.xpath('.//a[@name="itemlist-picture" and @dd_name="单品图片"]/@title').extract_first()  #这里extract返回的列表长度为1，得到这个列表的第一个值，下标为0
            item["link"] = li.xpath('.//a[@name="itemlist-picture"and @dd_name="单品图片"]/@href').extract_first()
            item["comment"] = li.xpath('.//p[@class="star"]//a[@name="itemlist-review" and @dd_name="单品评论"]/text()').extract_first()
            #找到问题了，这里面还提取了别的东西，没有值
            #print(item)
            yield item
        """

